AWS Systems Manager Change Calendarで祝日データのインポート時にエラーになった際の対処方法

AWS Systems Manager Change Calendarで祝日データのインポート時にエラーになった際の対処方法

Clock Icon2024.11.25

こんにちは。
繁松です。

はじめに

AWS Systems Manager Change Calendarで祝日を設定する際に、Googleカレンダーから日本の祝日データをエクスポート/インポートすることがあると思います。
その際にエラーになってしまったので、対応方法についてのブログになります。

https://dev.classmethod.jp/articles/ssm-change-calendar-import-holiday/

エラーについて

インポート時に以下のエラーになりました。
2024-11-25_21h21_13

Calendar import failed

Change Calendar could not read the calendar file. Re-export the source calendar and try again or troubleshoot issues  with .ics files.

以前までは成功していたのですが、エラーとなったため原因を調査したところ、インポートするイベントの件数が多すぎることが原因であると思われました。
インポートするイベントの件数が201以上の場合はエラーになり、200以下の場合はインポートが成功することを確認しました。
2024-11-25_21h40_42

※AWSドキュメントにはインポートするイベント件数の上限に関する記載はなかったので検証結果での推測となります。

対処方法

Googleカレンダーからエクスポートした休日のデータには2019年~のデータや、祭日(節分、ひな祭り)のデータなどSSM Change Calendarを利用する場合は不要になりそうなものも含まれています。
そのためイベント件数が310件となっていました。
こちらのサイトでカウント:https://ical.marudot.com/

2024-11-25_22h49_08

エクスポートしたデータの期間を絞り、祭日については除外することで件数を減らしインポート可能なデータに修正します。

今回はPythonを使って修正してみます。

  1. icalendarパッケージのインストール
    icsファイルを扱うためのPythonライブラリをインストールします。
    https://pypi.org/project/icalendar/
    https://icalendar.readthedocs.io/en/latest/
pip install icalendar
  1. Pythonコードの作成
    開始日と終了日を入力し絞り込みたい期間を設定します。
    今回は2024年始~2027年末の約4年間で絞り込んでいます。
from icalendar import Calendar
from datetime import date

def filter_ics(input_file, output_file, start_date, end_date):
    # 入力ファイルを読み込む
    with open(input_file, 'rb') as f:
        cal = Calendar.from_ical(f.read())

    # 新しいカレンダーを作成し、元のカレンダーのプロパティをコピー
    new_cal = Calendar()
    for attr, value in cal.items():
        new_cal.add(attr, value)

    # イベントをフィルタリング
    for component in cal.walk():
        if component.name == "VEVENT":
            event_start = component.get('dtstart').dt
            if (start_date <= event_start <= end_date and
                '祭日' not in str(component.get('description', ''))):
                new_cal.add_component(component)

    # 新しいICSファイルを書き出す
    with open(output_file, 'wb') as f:
        f.write(new_cal.to_ical())

# 使用例
input_file = 'basic.ics'  # 入力ファイル名
output_file = 'output.ics'  # 出力ファイル名
start_date = date(2024, 1, 1)  # 開始日
end_date = date(2027, 12, 31)  # 終了日

filter_ics(input_file, output_file, start_date, end_date)
print(f"Filtered events from {start_date} to {end_date} have been saved to {output_file}")

結果

Pythonスクリプトの実行後にイベント件数を確認すると「91件」のイベントが確認できました。
2024-11-25_22h55_05

絞り込んだ場合は、カレンダーのインポートも成功することを確認しました。
2024-11-25_22h55_49

念のため3年分の祝日を目視で確認しましたが、すべてインポートできていました。

さいごに

祝日のicsファイルをエクスポートするのに期間を指定して出力出来ないかや、祭日を除いて出力できなか等試行錯誤しましたが、Pythonを利用する方法となりました。

以上、祝日カレンダーのインポート時のエラー対応についてのブログでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.